package cn.demoncat.util.lang.entity.report;

import cn.demoncat.util.lang.LocalDateUtil;
import cn.demoncat.util.lang.constant.DateConstant;
import cn.demoncat.util.lang.constant.DecimalConstant;
import cn.demoncat.util.lang.constant.LongConstant;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;

/**
 * 报表数据基类
 *
 * 1、实现本接口
 * 2、调用ReportUtil完成图表处理
 * 
 * @author 延晓磊
 *
 * @since 2020年3月6日
 */
public interface ReportEntity {

	/**
	 * 统计时间
	 */
	String getDate();

	/**
	 * 统计时间
	 */
	void setDate(String date);

	/**
	 * 统计时间-年
	 */
	Integer getYear();

	/**
	 * 统计时间-年
	 */
	void setYear(Integer year);

	/**
	 * 统计时间-月
	 */
	Integer getMonth();

	/**
	 * 统计时间-月
	 */
	void setMonth(Integer month);

	/**
	 * 统计时间-日
	 */
	default Integer getDay() {
		return 1;
	}

	/**
	 * 统计时间-日
	 */
	default void setDay(Integer day) {
		// no day
	}

	/**
	 * 统计时间-时
	 */
	default Integer getHour() {
		return 0;
	}

	/**
	 * 统计时间-时
	 */
	default void setHour(Integer hour) {
		// no hour
	}

	/**
	 * 创建时间
	 */
	LocalDateTime getCreateTime();

	/**
	 * 创建时间
	 */
	void setCreateTime(LocalDateTime createTime);

	/**
	 * 统计分类/数据类型
	 */
	default String getType() {
		return null;
	}
	/**
	 * 统计分类/数据类型
	 */
	default void setType(String type) {

	}
	/**
	 * 统计项/数据ID
	 */
	default String getItem() {
		return null;
	}
	/**
	 * 统计项/数据ID
	 */
	default void setItem(String item) {

	}
	/**
	 * 统计标题/数据名称
	 */
	default String getTitle() {
		return null;
	}
	/**
	 * 统计标题/数据名称
	 */
	default void setTitle(String title) {

	}

	/**
	 * 统计数量/整数值
	 */
	default Long getCount() {
		return LongConstant.N0;
	}
	/**
	 * 统计数量/整数值
	 */
	default void setCount(Long count) {

	}
	/**
	 * 统计金额/浮点值
	 */
	default BigDecimal getSum() {
		return DecimalConstant.N0;
	}
	/**
	 * 统计金额/浮点值
	 */
	default void setSum(BigDecimal sum) {

	}


	/**
	 * 填充报表数据的时间属性（不包含createTime,date）
	 * 
	 * @param date
	 *            保存时间（已格式化）
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月8日
	 */
	default void fillTimes(LocalDate date) {
		this.setHour(0);
		this.setDay(date.getDayOfMonth());
		this.setMonth(date.getMonthValue());
		this.setYear(date.getYear());
	}
	
	/**
	 * 填充报表数据插入的时间属性（不包含createTime）
	 * 
	 * @param date 保存时间：yyyy-MM-dd 或 yyyy-MM-dd HH:mm:ss
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月8日
	 */
	default void fillTimes(String date) {
		date = LocalDateUtil.fullDateTime(date);
		LocalDateTime time = LocalDateTime.parse(date, DateConstant.DATE_TIME_FORMAT);
		this.setDate(date);
		this.setHour(time.getHour());
		this.setDay(time.getDayOfMonth());
		this.setMonth(time.getMonthValue());
		this.setYear(time.getYear());
	}
	
	/**
	 * 填充报表数据插入的时间属性（不包含createTime）
	 * 
	 * @param date
	 *            保存时间（已格式化）
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年7月8日
	 */
	default void fillTimes(LocalDateTime date) {
		this.setDate(date.format(DateConstant.DATE_TIME_FORMAT));
		this.setHour(date.getHour());
		this.setDay(date.getDayOfMonth());
		this.setMonth(date.getMonthValue());
		this.setYear(date.getYear());
	}

	/**
	 * 填充报表数据插入的时间属性
	 * 
	 * @param param
	 *            报表插入参数
	 * 
	 * @author 延晓磊
	 *
	 * @since 2019年12月11日
	 */
	default void fillTimes(ReportParamSave param) {
		this.setCreateTime(param.getNow());
		this.setDate(param.getDate());
		this.setHour(param.getHour());
		this.setDay(param.getDay());
		this.setMonth(param.getMonth());
		this.setYear(param.getYear());
	}
}
